package cn.mini.mybatis.mybatis.mapping;


import cn.mini.mybatis.mybatis.session.Configuration;
import cn.mini.mybatis.mybatis.type.JdbcType;
import cn.mini.mybatis.mybatis.type.TypeHandler;

/**
 * ParameterMapping 类用于封装 SQL 参数的映射信息，
 * 包含配置信息、属性名以及 Java 类型等，
 * 帮助 MyBatis 在执行 SQL 语句时正确处理参数。
 */
public class ParameterMapping {

    /**
     * MyBatis 的配置对象，包含了全局的配置信息。
     */
    private Configuration configuration;

    /**
     * SQL 参数对应的属性名，用于从参数对象中获取具体的值。
     */
    private String property;

    /**
     * SQL 参数对应的 Java 类型，默认为 Object 类型。
     */
    private Class<?> javaType = Object.class;
    private JdbcType jdbcType;

    private TypeHandler<?> typeHandler;
    /**
     * 私有构造函数，防止外部直接实例化，确保只能通过 Builder 模式创建对象。
     */
    private ParameterMapping() {
    }

    /**
     * Builder 类用于以建造者模式构建 ParameterMapping 对象，
     * 提供了更灵活的对象创建方式。
     */
    public static class Builder {

        /**
         * 要构建的 ParameterMapping 对象实例。
         */
        private ParameterMapping parameterMapping = new ParameterMapping();

        /**
         * 构造函数，初始化 ParameterMapping 对象的基本信息。
         *
         * @param configuration MyBatis 的配置对象
         * @param property SQL 参数对应的属性名
         * @param javaType SQL 参数对应的 Java 类型
         */
        public Builder(Configuration configuration, String property, Class<?> javaType) {
            parameterMapping.configuration = configuration;
            parameterMapping.property = property;
            parameterMapping.javaType = javaType;
        }

        /**
         * 设置 SQL 参数对应的 Java 类型，并返回当前 Builder 实例，
         * 支持链式调用。
         *
         * @param javaType SQL 参数对应的 Java 类型
         * @return 当前 Builder 实例
         */
        public Builder javaType(Class<?> javaType) {
            parameterMapping.javaType = javaType;
            return this;
        }
        public ParameterMapping build() {
            return parameterMapping;
        }
    }

    /**
     * 获取 MyBatis 的配置对象。
     *
     * @return MyBatis 的配置对象
     */
    public Configuration getConfiguration() {
        return configuration;
    }

    /**
     * 获取 SQL 参数对应的属性名。
     *
     * @return SQL 参数对应的属性名
     */
    public String getProperty() {
        return property;
    }

    /**
     * 获取 SQL 参数对应的 Java 类型。
     *
     * @return SQL 参数对应的 Java 类型
     */
    public Class<?> getJavaType() {
        return javaType;
    }



    public JdbcType getJdbcType() {
        return jdbcType;
    }

    public TypeHandler<?> getTypeHandler() {
        return typeHandler;
    }
}
